#include "shmComm.hpp"

int main(int,char**,char**)
{
    // 根据路径与项目id获取key值
    key_t key=ftok(PATH_NAME,PROJ_ID);
    if(key==-1)
    {
        perror("ftok");
        exit(1);
    }

    std::cout<<time(nullptr)<<" | ftok success | key:"<<key<<std::endl;

    // 通过key获取shmid
    int shmid=shmget(key,IPC_SIZE,IPC_CREAT|FILE_MODE);
    if(shmid==-1)
    {
        perror("shmget");
        exit(2);
    }

    std::cout<<time(nullptr)<<" | shmget success | shmid:"<<shmid<<std::endl;

    // 通过shmid进行挂载
    char* shmaddr=(char*)shmat(shmid,nullptr,0);
    if((void*)shmaddr==(void*)-1)
    {
        perror("shmat");
        exit(3);
    }

    std::cout<<time(nullptr)<<" | shmat success | shmaddr:"<<(void*)shmaddr<<std::endl;

    // 进行通信---写

    int fd=OpenFIFO(FIFO_PATH,WRITE);

    while(true)
    {
        ssize_t n=read(0,shmaddr,IPC_SIZE);
        
        shmaddr[n-1]='\0';

        Signal(fd);
        std::cout<<time(nullptr)<<" | Signal success | client fd:"<<fd<<std::endl;

        if(strcmp((char*)shmaddr,"quit")==0)
        {
            break;
        }
    }

    CloseFIFO(fd);
    // for(;;)
    // {
    //     ssize_t n=read(0,shmaddr,IPC_SIZE);
    //     shmaddr[n-1]='\0';
        
    //     if(strcmp(shmaddr,"quit")==0)
    //     {
    //         break;
    //     }
    // }

    // for(char ch='a';ch<='z';ch++)
    // {
    //     sprintf(shmaddr,"你好，服务器！我是客服端，我的pid为：%d %c\n",getpid(),ch);

    //     sleep(2);
    // }

    // ssize_t n=read(0,shmaddr,IPC_SIZE);
    // shmaddr[n-1]='\0';

    // 通过shmaddr取消挂载
    int ret = shmdt(shmaddr);
    if(ret==-1)
    {
        perror("shmdt");
        exit(4);
    }

    std::cout<<time(nullptr)<<" | shmdt success | ret:"<<ret<<std::endl;

    return 0;
}
